/*
* 包含多个action creator函数的模块
* 同步action：返回对象{type:'xxx', data:数据值}
* 异步action：返回函数dispatch => {}
* */

import {
  SET_HEAD_TITLE,
  RECEIVE_USER,
  DELETE_USER,
  SHOW_ERROR_MSG,
  SET_HASH_ROUTE_PARAMS
} from "./action-types";
import {reqLogin, reqLogout} from "../api";
import {userOptions} from "../utils/storageUtils";

/**
 * 设置头部标题的同步action
 */
export const setHeadTitle = headTitle => ({type: SET_HEAD_TITLE, data: headTitle});

/**
 * 接收用户的同步action
 * 这个函数在下面的“login”中调用。
 */
export const setUser = (user = null) => ({type: RECEIVE_USER, user});

/**
 * 登出，删除缓存中的user信息。
 * @param user
 * @return {{type: string, user: *}}
 */
export const deleteUser = (user = null) => ({type: DELETE_USER, user});

/**
 * 显示错误信息的同步action
 */
export const showErrorMsg = errorMsg => ({type: SHOW_ERROR_MSG, errorMsg});

/**
 * 设置哈希路由的参数
 */
export const setHashRouteParams = hashRouteParams =>
  ({type: SET_HASH_ROUTE_PARAMS, hashRouteParams});

/**
 * 登陆的异步action
 */
export const login = (username, password) => {
  return async dispatch => {
    /**
     * 1 执行异步ajax请求。
     * 注意：这里的第三个参数必须是true，用来执行md5加密。
     */
    const result = await reqLogin(username, password, true);
    // 2.1 如果成功了，分发成功的同步action

    // console.log('actions 中的 result ', result);

    // 打印结果：
    if (result.status === 0) {
      const user = {...result.data};
      // 保存到local中
      userOptions.setUser(user);
      /**
       * 这个是告诉所有使用user这个状态的组件更新状态
       * 分发接收用户的同步action
       */
      dispatch(setUser(user));
    }
    // 2.2 如果失败了，分发失败的同步action
    else {
      const {msg} = result;
      dispatch(showErrorMsg(msg));
    }
  };
};

/**
 * 退出登录的异步action
 */
export const logout = () => {
  return async dispatch => {
    // 1 执行异步ajax请求
    const result = await reqLogout();
    if (result.status === 0) {
      /**
       * todo 这里需要改进，看看redux中是否有清除缓存的功能。
       */
      userOptions.removeUser();
      dispatch(deleteUser());
    }
    // 2.2 如果失败了，分发失败的同步action
    else {
      const {msg} = result;
      dispatch(showErrorMsg(msg));
    }
  };
};